﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using SoftwareConsulting.Interfaces.BasicEntities;
using SoftwareConsulting.BI11.Studio.InternalServices;

namespace SoftwareConsulting.BI11.Studio.BasicEntities.Extensions
{
    public static class Extensions
    {                
        /// <summary>
        /// Проверяет элементы иерархии на наличие дубликата
        /// </summary>
        /// <param name="exceptedItem"></param>
        /// <param name="newName"></param>
        /// <returns></returns>
        public static bool CheckItemsForDuplicateByName<T>(this INamedHierarchy<T> hierarchy, T exceptedItem, string newName) where T : INamed
        {
            INamedHierarchy<T> got = hierarchy.GetItemsByName(newName, false);
            return got.ItemsCount == 0 || got.ItemsCount == 1 && got.Contains(exceptedItem);
        }

        /// <summary>
        /// Автоматически корректирует имя предполагаемого элемента иерархии, чтобы оно не дублировало другие имена
        /// </summary>
        /// <param name="item"></param>
        /// <param name="recursive"></param>
        public static void AutocorrectItemName<T>(this INamedHierarchy<T> hierarchy, T item, bool recursive) where T : INamed
        {
            string s = item.Name;
            while (!hierarchy.CheckItemsForDuplicateByName(item, s))
            {
                int k;
                bool parsed;
                int i = GeneralMethods.NumberOnEnd(s, out k, out parsed);
                if (!parsed)
                {
                    //всё! числа закончились
                    s += "_";
                    continue;
                }
                if (i == -1)
                {
                    s += "2";
                }
                else
                {
                    s = s.Substring(0, k) + (i + 1).ToString(CultureInfo.CurrentCulture);
                }
            }
            item.SetName(s);
            //для следующего случая нужна повторная корректировка:
            //добавляем характеристику в дочернюю ситуацию,
            //добавляем характеристику, описываемую другим показателем, в родительскую ситуацию,
            //добавляем характеристику, описываемую любым показателем, опять в родительскую ситуацию;
            //вот на последнем шаге и нужна повторная корректировка
            if (!recursive)
            {
                hierarchy.AutocorrectItemName(item, true);
            }
        }

        /*/// <summary>
        /// Предлагает имя для нового потенциального элемента
        /// </summary>
        /// <param name="wantName"></param>
        /// <returns></returns>
        public static string ProposeNameForPotentialItem(this INamedHierarchy<INamed> hierarchy, string wantName)
        {
            while (!hierarchy.CheckItemsForDuplicateByName(default(INamed), wantName))
            {
                int k;
                int i = GeneralMethods.NumberOnEnd(wantName, out k);
                if (i == -1)
                {
                    wantName = wantName + "2";
                }
                else
                {
                    wantName = wantName.Substring(0, k) + (i + 1).ToString(CultureInfo.CurrentCulture);
                }
            }
            return wantName;
        }*/
    }
}
